package com.ref.demo11;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

/**
 * @ClassName DbUtil
 * @Description 设计一个方法，基于某个对象自动生成添加数据的 SQL 语句，并把该对象的数据插入到数据库中
 *     public class DbUtil{
 *         public static int insert(User user){
 *             // 功能实现...
 *         }
 *     }
 * @Author Kx
 * @Date 2025/3/19 16:26
 * @Version 1.0
 */
public class DbUtil {
    /**
     * @description: 执行添加语句返回受影响行数
     * @author: Kx
     * @date: 2025/3/19 16:28
     * @param: [object]
     * @return: int
     **/
    public static int insert(Object object){
        // 获取 sql 语句
        String sql = generateInsertSql(object.getClass());

        try {
            // 获取连接对象
            Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/student","root","password");

            // 获取预编译对象
            PreparedStatement preparedStatement = connection.prepareStatement(sql);

            int index = 1;

            // 循环遍历把 object 对象中的字段值设置到预编译对象中
            for (Field field : object.getClass().getDeclaredFields()){
                // 设置字段可见性
                field.setAccessible(true);

                // 把字段值设置到预编译对象中
                preparedStatement.setObject(index++,field.get(object));
            }
            return preparedStatement.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 0;
    }


    /**
     * @description: 生成添加语句
     * @author: Kx
     * @date: 2025/3/19 16:33
     * @param: [beanClass, cond]
     * @return: java.lang.String
     **/
    private static String generateInsertSql(Class<?> beanClass){
        // 获取所有字段名
        Field[] declaredFields = beanClass.getDeclaredFields();

        // 拼接sql语句
        StringBuilder sql = new StringBuilder();
        sql.append("insert into ");

        // 拼接表名
        sql.append(beanClass.getSimpleName().toLowerCase()).append("(");

        // 循环拼接所有字段名
        for (Field field : declaredFields){
            sql.append(field.getName()).append(",");
        }

        // 去除最后一个逗号
        sql.deleteCharAt(sql.length() - 1);

        sql.append(") values(");

        // 循环拼接所有字段值的占位符
        for (int i = 0; i < declaredFields.length; i++) {
            sql.append("?,");
        }

        // 去除最后一个逗号
        sql.deleteCharAt(sql.length() - 1);

        sql.append(")");

        return sql.toString();
    }
}
